home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / ohlutil.zip / ARGMATCH.C < prev    next >
C/C++ Source or Header  |  1990-06-16  |  3KB  |  84 lines

  1. /* argmatch.c -- find a match for a string in an array
  2.    Copyright (C) 1990 Free Software Foundation, Inc.
  3.  
  4.    This program is free software; you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation; either version 1, or (at your option)
  7.    any later version.
  8.  
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.  
  14.    You should have received a copy of the GNU General Public License
  15.    along with this program; if not, write to the Free Software
  16.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  17.  
  18. /* Written by David MacKenzie <djm@ai.mit.edu> */
  19.  
  20. #include <stdio.h>
  21. #ifdef STDC_HEADERS
  22. #include <string.h>
  23. #endif
  24.  
  25. extern char *program_name;
  26.  
  27. /* If ARG is an unambiguous match for an element of the
  28.    null-terminated array OPTLIST, return the index in OPTLIST
  29.    of the matched element, else -1 if it does not match any element
  30.    or -2 if it is ambiguous (is a prefix of more than one element). */
  31.  
  32. int
  33. argmatch (arg, optlist)
  34.      char *arg;
  35.      char **optlist;
  36. {
  37.   int i;            /* Temporary index in OPTLIST. */
  38.   int arglen;            /* Length of ARG. */
  39.   int matchind = -1;        /* Index of first nonexact match. */
  40.   int ambiguous = 0;        /* If nonzero, multiple nonexact match(es). */
  41.   
  42.   arglen = strlen (arg);
  43.   
  44.   /* Test all elements for either exact match or abbreviated matches.  */
  45.   for (i = 0; optlist[i]; i++)
  46.     {
  47.       if (!strncmp (optlist[i], arg, arglen))
  48.     {
  49.       if (strlen (optlist[i]) == arglen)
  50.         /* Exact match found.  */
  51.         return i;
  52.       else if (matchind == -1)
  53.         /* First nonexact match found.  */
  54.         matchind = i;
  55.       else
  56.         /* Second nonexact match found.  */
  57.         ambiguous = 1;
  58.     }
  59.     }
  60.   if (ambiguous)
  61.     return -2;
  62.   else
  63.     return matchind;
  64. }
  65.  
  66. /* Error reporting for argmatch.
  67.    KIND is a description of the type of entity that was being matched.
  68.    VALUE is the invalid value that was given.
  69.    PROBLEM is the return value from argmatch. */
  70.  
  71. void
  72. invalid_arg (kind, value, problem)
  73.      char *kind;
  74.      char *value;
  75.      int problem;
  76. {
  77.   fprintf (stderr, "%s: ", program_name);
  78.   if (problem == -1)
  79.     fprintf (stderr, "invalid");
  80.   else                /* Assume -2. */
  81.     fprintf (stderr, "ambiguous");
  82.   fprintf (stderr, " %s `%s'\n", kind, value);
  83. }
  84.